package juc.mysynchronized;

/**
 * @ClassName PhaserExample
 * @PackageName juc.mysynchronized
 * @projectName myThread
 * @Description TODO
 * @Author games
 * @Date 2025/9/4 下午4:14
 * @Version 1.0
 */
import java.util.concurrent.Phaser;

/**
 * 3. Phaser（阶段协同器）
 * 应用场景：
 *
 * 跟团旅游，团建，批量数据处理：管理多个阶段的执行，可以让程序员灵活地控制线程的执行顺序和阶段性的执行。
 * 多级任务分配：Phaser 可以用于实现多级任务流程，在每一级任务完成后触发下一级任务的开始。
 * 模拟并行计算：Phaser 可以用于模拟并行计算，协调多个线程间的工作。
 * 阶段性任务：Phaser 可以用于实现阶段性任务，在每一阶段任务完成后触发下一阶段任务的开始。
 */
public class PhaserExample {
    private static final Phaser phaser = new Phaser(3); // 初始化三个参与者

    /**
     * 程序的主入口方法
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 循环创建3个线程
        for (int i = 0; i < 3; i++) {
            // 使用lambda表达式创建并启动线程
            new Thread(() -> {
                // 打印线程开始第一阶段的信息
                System.out.println(Thread.currentThread().getName() + " is starting phase 1.");
                // 执行一些工作
                doSomeWork();
                phaser.arriveAndAwaitAdvance(); // 完成第一阶段，等待其他线程

                System.out.println(Thread.currentThread().getName() + " is starting phase 2.");
                doSomeWork();
                phaser.arriveAndDeregister(); // 完成第二阶段，注销自己
            }).start();
        }

        phaser.arriveAndDeregister(); // 主线程也参与阶段控制
    }

    private static void doSomeWork() {
        try {
            Thread.sleep((long) (Math.random() * 1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
